{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9",
   "metadata": {},
   "source": [
    "# SEU PRIMEIRO LAB\n",
    "### Por favor, leia esta seção. Ela é valiosa para deixar você preparado, mesmo que seja uma leitura longa -- é um conteúdo importante.\n",
    "\n",
    "### Também não deixe de ler [README.md](../README.md)! Mais informações sobre os vídeos atualizados no README e [no topo dos recursos do curso em roxo](https://edwarddonner.com/2024/11/13/llm-engineering-resources/)\n",
    "\n",
    "## Seu primeiro projeto com um LLM de fronteira\n",
    "\n",
    "Ao final deste curso, você terá construído uma solução autônoma de IA agentica com 7 agentes que colaboram para resolver um problema de negócios. Tudo a seu tempo! Vamos começar com algo menor...\n",
    "\n",
    "Nosso objetivo é programar um novo tipo de navegador web. Dê a ele uma URL e ele responderá com um resumo. O Reader's Digest da internet!!\n",
    "\n",
    "Antes de começar, você deve ter concluído a configuração indicada no README.\n",
    "\n",
    "### Se você é novo em trabalhar com \"Notebooks\" (também conhecidos como Labs ou Jupyter Lab)\n",
    "\n",
    "Bem-vindo ao maravilhoso mundo da experimentação em Data Science! Simplesmente clique em cada \"célula\" que tiver código, como a célula logo abaixo deste texto, e pressione Shift+Return para executar aquela célula. Certifique-se de rodar todas as células, começando do topo, em ordem.\n",
    "\n",
    "Por favor, consulte a [pasta Guides](../guides/01_intro.ipynb) para ver todos os guias.\n",
    "\n",
    "## Estou aqui para ajudar\n",
    "\n",
    "Se você tiver qualquer problema, por favor, entre em contato.  \n",
    "Estou disponível pela plataforma, ou via ed@edwarddonner.com, ou em https://www.linkedin.com/in/eddonner/ caso você queira se conectar (e eu adoro me conectar!)  \n",
    "E isso é novo para mim, mas também estou experimentando o X em [@edwarddonner](https://x.com/edwarddonner) - se você estiver no X, por favor me mostre como é que se faz 😂  \n",
    "\n",
    "## Mais soluções de problemas\n",
    "\n",
    "Consulte o notebook [troubleshooting](../setup/troubleshooting.ipynb) na pasta de configuração para diagnosticar e corrigir problemas comuns. No final dele há um script de diagnósticos com algumas informações úteis de depuração.\n",
    "\n",
    "## Se isso já for rotina!\n",
    "\n",
    "Se você já estiver confortável com o material de hoje, segure as pontas; você pode avançar rapidamente pelos primeiros labs - iremos nos aprofundar muito mais conforme as semanas avançam. No fim, ajustaremos finamente nosso próprio LLM para competir com a OpenAI!\n",
    "\n",
    "<table style=\"margin: 0; text-align: left;\">\n",
    "    <tr>\n",
    "        <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
    "            <img src=\"../assets/important.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
    "        </td>\n",
    "        <td>\n",
    "            <h2 style=\"color:#900;\">Por favor, leia - nota importante</h2>\n",
    "            <span style=\"color:#900;\">A forma como colaboro com você pode ser diferente de outros cursos que você já fez. Prefiro não digitar código enquanto você assiste. Em vez disso, executo Jupyter Labs, como este, e lhe dou uma intuição sobre o que está acontecendo. Minha sugestão é que você execute tudo com atenção por conta própria, <b>depois</b> de assistir à aula. Adicione instruções de print para entender o que está acontecendo e depois crie suas próprias variações. Se você tiver uma conta no Github, use-a para mostrar suas variações. Isso não é apenas prática essencial, como também demonstra suas habilidades para outras pessoas, incluindo talvez futuros clientes ou empregadores...</span>\n",
    "        </td>\n",
    "    </tr>\n",
    "</table>\n",
    "<table style=\"margin: 0; text-align: left;\">\n",
    "    <tr>\n",
    "        <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
    "            <img src=\"../assets/resources.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
    "        </td>\n",
    "        <td>\n",
    "            <h2 style=\"color:#f71;\">Este código é um recurso vivo - fique de olho nos meus e-mails</h2>\n",
    "            <span style=\"color:#f71;\">Eu publico atualizações do código regularmente. À medida que as pessoas fazem perguntas, adiciono mais exemplos ou comentários aprimorados. Como resultado, você notará que o código abaixo não é idêntico ao dos vídeos. Tudo dos vídeos está aqui; mas também acrescentei explicações melhores e novos modelos como o DeepSeek. Considere isto como um livro interativo.<br/><br/>\n",
    "                Tento enviar e-mails regularmente com atualizações importantes relacionadas ao curso. Você pode encontrá-los na seção 'Announcements' da Udemy na barra lateral esquerda. Você também pode optar por receber meus e-mails pelas suas Configurações de Notificação na Udemy. Respeito a sua caixa de entrada e sempre procuro acrescentar valor nas minhas mensagens!\n",
    "            </span>\n",
    "        </td>\n",
    "    </tr>\n",
    "</table>\n",
    "<table style=\"margin: 0; text-align: left;\">\n",
    "    <tr>\n",
    "        <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
    "            <img src=\"../assets/business.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
    "        </td>\n",
    "        <td>\n",
    "            <h2 style=\"color:#181;\">Valor de negócios destes exercícios</h2>\n",
    "            <span style=\"color:#181;\">Um último pensamento. Embora eu tenha desenhado estes notebooks para serem educacionais, também procurei deixá-los divertidos. Faremos coisas legais, como fazer LLMs contarem piadas e discutirem entre si. Mas, fundamentalmente, meu objetivo é ensinar habilidades que você possa aplicar nos negócios. Vou explicar as implicações para o negócio ao longo do caminho, e vale a pena ter isso em mente: à medida que você ganha experiência com modelos e técnicas, pense em maneiras de colocar isso em prática no trabalho hoje. Por favor, entre em contato se quiser conversar mais ou se tiver ideias para compartilhar comigo.</span>\n",
    "        </td>\n",
    "    </tr>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83f28feb",
   "metadata": {},
   "source": [
    "### Se necessário, instale as extensões do Cursor\n",
    "\n",
    "1. No menu View, selecione Extensions\n",
    "2. Pesquise por Python\n",
    "3. Clique em \"Python\" feito por \"ms-python\" e selecione Install se ainda não estiver instalado\n",
    "4. Pesquise por Jupyter\n",
    "5. Clique em \"Jupyter\" feito por \"ms-toolsai\" e selecione Install se ainda não estiver instalado\n",
    "\n",
    "\n",
    "### Em seguida, selecione o Kernel\n",
    "\n",
    "Clique em \"Select Kernel\" no canto superior direito\n",
    "\n",
    "Escolha \"Python Environments...\"\n",
    "\n",
    "Depois escolha aquele que se parece com `.venv (Python 3.12.x) .venv/bin/python` - ele deve estar marcado como \"Recommended\" e ter uma estrela grande ao lado.\n",
    "\n",
    "Qualquer problema com isso? Vá para o troubleshooting.\n",
    "\n",
    "### Observação: você precisará definir o Kernel em cada notebook.."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# importações\n",
    "\n",
    "import os\n",
    "from dotenv import load_dotenv\n",
    "from scraper import fetch_website_contents\n",
    "from IPython.display import Markdown, display\n",
    "from openai import OpenAI\n",
    "\n",
    "# Se você receber um erro ao executar esta célula, vá para o notebook de solução de problemas!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6900b2a8-6384-4316-8aaa-5e519fca4254",
   "metadata": {},
   "source": [
    "# Conectando-se à OpenAI (ou ao Ollama)\n",
    "\n",
    "A próxima célula é onde carregamos as variáveis de ambiente do seu arquivo `.env` e fazemos a conexão com a OpenAI.  \n",
    "\n",
    "Se preferir usar o Ollama gratuito, consulte a seção \"Free Alternative to Paid APIs\" no README e, caso não saiba como fazer isso, há uma solução completa na pasta de soluções (day1_with_ollama.ipynb).\n",
    "\n",
    "## Solução de problemas caso você tenha dificuldades:\n",
    "\n",
    "Se você receber um \"Name Error\" - você executou todas as células de cima para baixo? Vá para o guia Python Foundations para um método infalível de encontrar e corrigir todos os Name Errors.\n",
    "\n",
    "Se isso não resolver, vá para o notebook [troubleshooting](../setup/troubleshooting.ipynb) para obter código passo a passo que identifica a causa raiz e corrige o problema!\n",
    "\n",
    "Ou então, fale comigo! Envie uma mensagem ou um e-mail para ed@edwarddonner.com e faremos isso funcionar.\n",
    "\n",
    "Alguma preocupação com custos de API? Veja minhas notas no README - os custos devem ser mínimos e você pode controlá-los a todo momento. Você também pode usar o Ollama como alternativa gratuita, que discutimos no Dia 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7b87cadb-d513-4303-baee-a37b6f938e4d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chave de API encontrada e, até aqui, parece tudo certo!\n"
     ]
    }
   ],
   "source": [
    "# Carregue as variáveis de ambiente em um arquivo chamado .env\n",
    "\n",
    "load_dotenv(override=True)\n",
    "api_key = os.getenv('OPENAI_API_KEY')\n",
    "\n",
    "# Verifique a chave\n",
    "\n",
    "if not api_key:\n",
    "    print(\"Nenhuma chave de API foi encontrada - por favor, vá até o notebook de solução de problemas nesta pasta para identificar e corrigir!\")\n",
    "elif not api_key.startswith(\"sk-proj-\"):\n",
    "    print(\"Uma chave de API foi encontrada, mas ela não começa com sk-proj-; verifique se você está usando a chave correta - consulte o notebook de solução de problemas\")\n",
    "elif api_key.strip() != api_key:\n",
    "    print(\"Uma chave de API foi encontrada, mas parece que ela pode ter caracteres de espaço ou tab no início ou no fim - remova-os, por favor - consulte o notebook de solução de problemas\")\n",
    "else:\n",
    "    print(\"Chave de API encontrada e, até aqui, parece tudo certo!\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "442fc84b-0815-4f40-99ab-d9a5da6bda91",
   "metadata": {},
   "source": [
    "# Vamos fazer uma chamada rápida a um modelo de fronteira para começar, como uma prévia!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a58394bf-1e45-46af-9bfd-01e24da6f49a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'role': 'user',\n",
       "  'content': 'Olá, GPT! Esta é minha primeira mensagem para você! Oi!'}]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Para dar uma prévia -- chamar a OpenAI com estas mensagens é tão simples. Qualquer problema, vá para o notebook de solução de problemas.\n",
    "\n",
    "message = \"Olá, GPT! Esta é minha primeira mensagem para você! Oi!\"\n",
    "\n",
    "messages = [{\"role\": \"user\", \"content\": message}]\n",
    "\n",
    "messages\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "08330159",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Oi! Prazer em te conhecer. Sou o ChatGPT. Posso ajudar com várias coisas, por exemplo:\\n- esclarecer dúvidas e explicar temas\\n- escrever ou revisar textos (e-mails, trabalhos, posts)\\n- revisar gramática e estilo\\n- gerar ideias e brainstorms\\n- traduzir entre idiomas\\n- ajudar com programação\\n- planejar tarefas, estudos, viagens\\n\\nO que você quer fazer hoje? Conte-me o tema ou a tarefa, e o nível de detalhe que você prefere.'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "openai = OpenAI()\n",
    "\n",
    "response = openai.chat.completions.create(model=\"gpt-5-nano\", messages=messages)\n",
    "response.choices[0].message.content"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2aa190e5-cb31-456a-96cc-db109919cd78",
   "metadata": {},
   "source": [
    "## OK, em frente com nosso primeiro projeto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Home - Edward Donner\n",
      "\n",
      "Home\n",
      "Connect Four\n",
      "Outsmart\n",
      "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n",
      "About\n",
      "Posts\n",
      "Well, hi there.\n",
      "I’m Ed. I like writing code and experimenting with LLMs, and hopefully you’re here because you do too. I also enjoy DJing (but I’m badly out of practice), amateur electronic music production (\n",
      "very\n",
      "amateur) and losing myself in\n",
      "Hacker News\n",
      ", nodding my head sagely to things I only half understand.\n",
      "I’m the co-founder and CTO of\n",
      "Nebula.io\n",
      ". We’re applying AI to a field where it can make a massive, positive impact: helping people discover their potential and pursue their reason for being. Recruiters use our product today to source, understand, engage and manage talent. I’m previously the founder and CEO of AI startup untapt,\n",
      "acquired in 2021\n",
      ".\n",
      "We work with groundbreaking, proprietary LLMs verticalized for talent, we’ve\n",
      "patented\n",
      "our matching model, and our award-winning platform has happy customers and tons of press coverage.\n",
      "Connect\n",
      "with me for more!\n",
      "September 15, 2025\n",
      "AI in Production: Gen AI and Agentic AI on AWS at scale\n",
      "May 28, 2025\n",
      "Connecting my courses – become an LLM expert and leader\n",
      "May 18, 2025\n",
      "2025 AI Executive Briefing\n",
      "April 21, 2025\n",
      "The Complete Agentic AI Engineering Course\n",
      "Navigation\n",
      "Home\n",
      "Connect Four\n",
      "Outsmart\n",
      "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n",
      "About\n",
      "Posts\n",
      "Get in touch\n",
      "ed [at] edwarddonner [dot] com\n",
      "www.edwarddonner.com\n",
      "Follow me\n",
      "LinkedIn\n",
      "Twitter\n",
      "Facebook\n",
      "Subscribe to newsletter\n",
      "Type your email…\n",
      "Subscribe\n"
     ]
    }
   ],
   "source": [
    "# Vamos testar este utilitário\n",
    "\n",
    "ed = fetch_website_contents(\"https://edwarddonner.com\")\n",
    "print(ed)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a478a0c-2c53-48ff-869c-4d08199931e1",
   "metadata": {},
   "source": [
    "## Tipos de prompts\n",
    "\n",
    "Você talvez já saiba disso - mas, caso não, vai ficar muito familiarizado!\n",
    "\n",
    "Modelos como o GPT foram treinados para receber instruções de uma maneira específica.\n",
    "\n",
    "Eles esperam receber:\n",
    "\n",
    "**Um prompt de sistema** que lhes diz qual tarefa estão realizando e qual tom devem usar\n",
    "\n",
    "**Um prompt de usuário** -- o início da conversa ao qual devem responder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "abdb8417-c5dc-44bc-9bee-2e059d162699",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Defina nosso prompt de sistema - você pode experimentar com isso depois, alterando a última frase para \"Respond in markdown in Spanish.\"\n",
    "\n",
    "system_prompt = \"\"\"\n",
    "Você é um assistente sarcástico que analisa o conteúdo de um site,\n",
    "e fornece um resumo curto, sarcástico e bem-humorado, ignorando textos que possam estar relacionados à navegação.\n",
    "Responda em markdown. Não coloque o markdown dentro de um bloco de código - responda apenas com o markdown.\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f0275b1b-7cfe-4f9d-abfa-7650d378da0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Defina nosso prompt de usuário\n",
    "\n",
    "user_prompt_prefix = \"\"\"\n",
    "Aqui está o conteúdo de um site.\n",
    "Forneça um resumo curto deste site.\n",
    "Se ele incluir notícias ou anúncios, então resuma-os também.\n",
    "\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea211b5f-28e1-4a86-8e52-c0b7677cadcc",
   "metadata": {},
   "source": [
    "## Mensagens\n",
    "\n",
    "A API da OpenAI espera receber mensagens em uma estrutura específica.\n",
    "Muitas das outras APIs compartilham essa estrutura:\n",
    "\n",
    "```python\n",
    "[\n",
    "    {\"role\": \"system\", \"content\": \"system message goes here\"},\n",
    "    {\"role\": \"user\", \"content\": \"user message goes here\"}\n",
    "]\n",
    "```\n",
    "Para dar uma prévia, as próximas 2 células fazem uma chamada bem simples - ainda não vamos exigir muito do poderoso GPT!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f25dcd35-0cd0-4235-9f64-ac37ed9eaaa5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2 + 2 é igual a 4.'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "messages = [\n",
    "    {\"role\": \"system\", \"content\": \"Você é um assistente prestativo\"},\n",
    "    {\"role\": \"user\", \"content\": \"Quanto é 2 + 2?\"}\n",
    "]\n",
    "\n",
    "response = openai.chat.completions.create(model=\"gpt-4.1-nano\", messages=messages)\n",
    "response.choices[0].message.content"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47",
   "metadata": {},
   "source": [
    "## E agora vamos construir mensagens úteis para o GPT-4.1-mini, usando uma função"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0134dfa4-8299-48b5-b444-f2a8c3403c88",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Veja como esta função cria exatamente o formato acima\n",
    "\n",
    "def messages_for(website):\n",
    "    return [\n",
    "        {\"role\": \"system\", \"content\": system_prompt},\n",
    "        {\"role\": \"user\", \"content\": user_prompt_prefix + website}\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "36478464-39ee-485c-9f3f-6a4e458dbc9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'role': 'system',\n",
       "  'content': '\\nVocê é um assistente sarcástico que analisa o conteúdo de um site,\\ne fornece um resumo curto, sarcástico e bem-humorado, ignorando textos que possam estar relacionados à navegação.\\nResponda em markdown. Não coloque o markdown dentro de um bloco de código - responda apenas com o markdown.\\n'},\n",
       " {'role': 'user',\n",
       "  'content': '\\nAqui está o conteúdo de um site.\\nForneça um resumo curto deste site.\\nSe ele incluir notícias ou anúncios, então resuma-os também.\\n\\nHome - Edward Donner\\n\\nHome\\nConnect Four\\nOutsmart\\nAn arena that pits LLMs against each other in a battle of diplomacy and deviousness\\nAbout\\nPosts\\nWell, hi there.\\nI’m Ed. I like writing code and experimenting with LLMs, and hopefully you’re here because you do too. I also enjoy DJing (but I’m badly out of practice), amateur electronic music production (\\nvery\\namateur) and losing myself in\\nHacker News\\n, nodding my head sagely to things I only half understand.\\nI’m the co-founder and CTO of\\nNebula.io\\n. We’re applying AI to a field where it can make a massive, positive impact: helping people discover their potential and pursue their reason for being. Recruiters use our product today to source, understand, engage and manage talent. I’m previously the founder and CEO of AI startup untapt,\\nacquired in 2021\\n.\\nWe work with groundbreaking, proprietary LLMs verticalized for talent, we’ve\\npatented\\nour matching model, and our award-winning platform has happy customers and tons of press coverage.\\nConnect\\nwith me for more!\\nSeptember 15, 2025\\nAI in Production: Gen AI and Agentic AI on AWS at scale\\nMay 28, 2025\\nConnecting my courses – become an LLM expert and leader\\nMay 18, 2025\\n2025 AI Executive Briefing\\nApril 21, 2025\\nThe Complete Agentic AI Engineering Course\\nNavigation\\nHome\\nConnect Four\\nOutsmart\\nAn arena that pits LLMs against each other in a battle of diplomacy and deviousness\\nAbout\\nPosts\\nGet in touch\\ned [at] edwarddonner [dot] com\\nwww.edwarddonner.com\\nFollow me\\nLinkedIn\\nTwitter\\nFacebook\\nSubscribe to newsletter\\nType your email…\\nSubscribe'}]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Experimente isto e depois teste com mais alguns sites\n",
    "\n",
    "messages_for(ed)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0",
   "metadata": {},
   "source": [
    "## Hora de juntar tudo - a API da OpenAI é muito simples!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "905b9919-aba7-45b5-ae65-81b3d1d78e34",
   "metadata": {},
   "outputs": [],
   "source": [
    "# E agora: chame a API da OpenAI. Você vai ficar muito familiarizado com isso!\n",
    "\n",
    "def summarize(url):\n",
    "    website = fetch_website_contents(url)\n",
    "    response = openai.chat.completions.create(\n",
    "        model = \"gpt-4.1-mini\",\n",
    "        messages = messages_for(website)\n",
    "    )\n",
    "    return response.choices[0].message.content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "summarize(\"https://edwarddonner.com\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3d926d59-450e-4609-92ba-2d6f244f1342",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Uma função para exibir isso de forma agradável na saída, usando markdown\n",
    "\n",
    "def display_summary(url):\n",
    "    summary = summarize(url)\n",
    "    display(Markdown(summary))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3018853a-445f-41ff-9560-d925d1774b2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "display_summary(\"https://edwarddonner.com\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3bcf6f4-adce-45e9-97ad-d9a5d7a3a624",
   "metadata": {},
   "source": [
    "# Vamos testar mais sites\n",
    "\n",
    "Observe que isso só funciona em sites que podem ser raspados usando esta abordagem simplista.\n",
    "\n",
    "Sites renderizados com Javascript, como apps em React, não aparecerão. Consulte a pasta community-contributions para uma implementação em Selenium que contorna isso. Você precisará ler sobre como instalar o Selenium (pergunte ao ChatGPT!)\n",
    "\n",
    "Além disso, sites protegidos com CloudFront (e semelhantes) podem retornar erros 403 - muito obrigado ao Andy J por apontar isso.\n",
    "\n",
    "Mas muitos sites funcionarão muito bem!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "45d83403-a24c-44b5-84ac-961449b4008f",
   "metadata": {},
   "outputs": [],
   "source": [
    "display_summary(\"https://cnn.com\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75e9fd40-b354-4341-991e-863ef2e59db7",
   "metadata": {},
   "outputs": [],
   "source": [
    "display_summary(\"https://anthropic.com\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c951be1a-7f1b-448f-af1f-845978e47e2c",
   "metadata": {},
   "source": [
    "<table style=\"margin: 0; text-align: left;\">\n",
    "    <tr>\n",
    "        <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
    "            <img src=\"../assets/business.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
    "        </td>\n",
    "        <td>\n",
    "            <h2 style=\"color:#181;\">Aplicações de negócios</h2>\n",
    "            <span style=\"color:#181;\">Neste exercício, você conheceu como chamar a API em nuvem de um modelo de fronteira (um modelo líder na vanguarda da IA) pela primeira vez. Usaremos APIs como a OpenAI em muitas etapas do curso, além de construir nossos próprios LLMs.\n",
    "\n",
    "Mais especificamente, aplicamos isso à sumarização - um caso de uso clássico de IA generativa para produzir um resumo. Isso pode ser aplicado a qualquer vertical de negócios - resumir notícias, resumir desempenho financeiro, resumir um currículo em uma carta de apresentação - as aplicações são ilimitadas. Considere como você poderia aplicar a sumarização no seu negócio e tente prototipar uma solução.</span>\n",
    "        </td>\n",
    "    </tr>\n",
    "</table>\n",
    "\n",
    "<table style=\"margin: 0; text-align: left;\">\n",
    "    <tr>\n",
    "        <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
    "            <img src=\"../assets/important.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
    "        </td>\n",
    "        <td>\n",
    "            <h2 style=\"color:#900;\">Antes de continuar - agora tente você mesmo</h2>\n",
    "            <span style=\"color:#900;\">Use a célula abaixo para criar seu próprio exemplo comercial simples. Mantenha-se no caso de uso de sumarização por enquanto. Aqui vai uma ideia: escreva algo que pegue o conteúdo de um e-mail e sugira uma linha de assunto curta e apropriada para o e-mail. Esse é o tipo de recurso que poderia ser incorporado a uma ferramenta comercial de e-mail.</span>\n",
    "        </td>\n",
    "    </tr>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00743dac-0e70-45b7-879a-d7293a6f68a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Passo 1: Crie seus prompts\n",
    "\n",
    "system_prompt = \"something here\"\n",
    "user_prompt = \"\"\"\n",
    "    Muito texto\n",
    "    Pode ser colado aqui\n",
    "\"\"\"\n",
    "\n",
    "# Passo 2: Monte a lista de mensagens\n",
    "\n",
    "messages = [] # preencha isto\n",
    "\n",
    "# Passo 3: Chame a OpenAI\n",
    "# response =\n",
    "\n",
    "# Passo 4: imprima o resultado\n",
    "# print("
   ]
  },
  {
   "cell_type": "markdown",
   "id": "36ed9f14-b349-40e9-a42c-b367e77f8bda",
   "metadata": {},
   "source": [
    "## Um exercício extra para quem gosta de web scraping\n",
    "\n",
    "Você pode notar que, se tentar `display_summary(\"https://openai.com\")`, não funciona! Isso acontece porque a OpenAI tem um site sofisticado que usa Javascript. Existem muitas maneiras de contornar isso com as quais alguns de vocês talvez estejam familiarizados. Por exemplo, Selenium é um framework extremamente popular que executa um navegador nos bastidores, renderiza a página e permite consultá-la. Se você tiver experiência com Selenium, Playwright ou similares, fique à vontade para melhorar a classe Website para usá-los. Na pasta community-contributions, você encontrará um exemplo de solução em Selenium enviada por um aluno (obrigado!)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eeab24dc-5f90-4570-b542-b0585aca3eb6",
   "metadata": {},
   "source": [
    "# Compartilhando seu código\n",
    "\n",
    "Eu adoraria que você compartilhasse seu código depois para que eu possa compartilhá-lo com outras pessoas! Você perceberá que alguns alunos já fizeram alterações (incluindo uma implementação em Selenium) que você encontrará na pasta community-contributions. Se quiser adicionar suas mudanças a essa pasta, envie um Pull Request com suas novas versões naquela pasta e eu farei o merge das suas alterações.\n",
    "\n",
    "Se você não for especialista em git (e eu também não sou!), o GPT forneceu algumas instruções legais sobre como enviar um Pull Request. É um processo um pouco trabalhoso, mas depois que você faz uma vez fica bem claro. Uma dica profissional: é melhor limpar as saídas dos seus notebooks Jupyter (Edit >> Clean outputs of all cells e depois Save) para manter os notebooks limpos.\n",
    "\n",
    "Aqui vão boas instruções, cortesia de um amigo IA:  \n",
    "https://chatgpt.com/share/677a9cb5-c64c-8012-99e0-e06e88afd293"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
